﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Configuration;

namespace DBConnect
{
    public static class Connect
    {
        //private OleDbConnection Connect = new OleDbConnection(ConfigurationSettings.AppSettings["Conn"]);
        private static OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\app_Data\modcon.accdb;Persist Security Info=True");

        private static void abreConexao()
        {
            try
            {
                conn.Open(); //Abre a conexão com BD
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao abrir a conexão: " + e.Message);
            }
        }

        private static void fechaConexao()
        {
            try
            {
                conn.Close(); //Fecha conexão com BD
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao fechar a conexão: " + e.Message);
            }
        }
        /// <summary>
        /// Executa uma query INSERT ou DELETE considerando os parâmetros (OleDbParameter)
        /// </summary>
        /// <param name="query">INSERT ou DELETE</param>
        /// <param name="queryout">SELECT (Ex. SELECT MAX...), "" (vazio) não executa query</param>
        /// <param name="parameters">parâmetros da query (INS/DEL)</param>
        /// <returns>Retorna o valor da primeira coluna da primeira linha de uma query SELECT executada após a query anterior</returns>
        public static string executa(string query, string queryout, params OleDbParameter[] parameters)
        {
            string registroInserido = "";

            try
            {
                abreConexao();
                OleDbCommand cmd = new OleDbCommand(query, conn);

                foreach (OleDbParameter param in parameters)
                {
                    cmd.Parameters.Add(param);

                }
                cmd.ExecuteNonQuery();//Executa a query no bd
                cmd.Parameters.Clear();
            }
            //catch (OleDbException e)
            //{
            //    throw new Exception("Erro ao executar query " + query + "\n" + e.Message);
            //}
            catch (Exception e)
            {
                throw new Exception("Erro ao executar query " + query + "\n" + e.Message, e.InnerException);
            }
            finally
            {
                fechaConexao();
            }

            if (queryout != "")
                registroInserido = seleciona(queryout).Tables[0].Rows[0].ItemArray[0].ToString();

            return registroInserido;
        }
        /// <summary>
        /// Executa uma query SELECT considerando os parâmetros (OleDbParameter)
        /// </summary>
        /// <param name="query">SELECT (Ex. SELECT * FROM...)</param>
        /// <param name="parameters">parâmetros da query (Ex. "@cod")</param>
        /// <returns>Retorna o DataSet da query executada</returns>
        public static DataSet seleciona(string query, params OleDbParameter[] parameters)
        {
            try
            {
                DataSet ds = new DataSet();
                abreConexao();

                OleDbCommand cmd = new OleDbCommand(query, conn);
                foreach (OleDbParameter param in parameters)
                    cmd.Parameters.Add(param);

                OleDbDataAdapter da = new OleDbDataAdapter(cmd);

                da.Fill(ds); //Preenche DataSet
                cmd.Parameters.Clear();
                return ds; //Retorna o DataSet já contendo os dados
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao selecionar query " + query + "\n" + e.Message);
            }
            finally
            {
                fechaConexao();
            }
        }
    }
}
